{ "metadata": { "name": "", "signature": "sha256:6d4cff5e9ec07b7e780a38ec7a46f9733819979721f8398fe79def5fa45fdc2e" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# IPython: an enviromnent for interactive computing" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "## What is IPython?\n", "\n", "- Short for *I*nteractive *Python*\n", "- A platform for you to *interact* with your code and data\n", "- The *notebook*: a system for *literate computing*\n", " * The combination of narrative, code and results\n", " * Weave your scientific narratives together with your computational process\n", "- Tools for easy parallel computing\n", " * Interact with *many* processes" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "IPython at the terminal" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The basic IPython client: at the terminal, simply type `ipython`:\n", "\n", " $ ipython\n", " Python 2.7.4 (default, Apr 19 2013, 18:28:01) \n", " Type \"copyright\", \"credits\" or \"license\" for more information.\n", " \n", " IPython 1.0.0 -- An enhanced Interactive Python.\n", " ? -> Introduction and overview of IPython's features.\n", " %quickref -> Quick reference.\n", " help -> Python's own help system.\n", " object? -> Details about 'object', use 'object??' for extra details.\n", " \n", " In [1]: print \"hello world\"\n", " hello world\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Some tutorial help/resources :\n", "\n", " - The [IPython website](http://ipython.org)\n", " - Search for \"IPython in depth\" tutorial on youtube and pyvideo, much longer, much deeper\n", " - Ask for help on [Stackoverflow, tag it \"ipython\"](http://stackoverflow.com/questions/tagged/ipython)\n", " - [Mailing list](http://mail.scipy.org/mailman/listinfo/ipython-dev)\n", " - File a [github issue](http://github.com/ipython/ipython)\n", " - [Twitter](https://twitter.com/IPythonDev)\n", " - [Reddit](http://www.reddit.com/r/IPython)\n", " - [Notebook Gallery](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks)\n", " - full books" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "IPython: beyond plain Python" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "When executing code in IPython, all valid Python syntax works as-is, but IPython provides a number of features designed to make the interactive experience more fluid and efficient." ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "First things first: running code, getting help" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "To start a python notebook simply type:\n", "\n", "`ipython notebook`\n", "\n", "This will open a console in your browser from which you can create a new notebook or work with an existing notebook in that directory.\n", "\n", "In the notebook, to run a cell of code, hit `Shift-Enter`. This executes the cell and puts the cursor in the next cell below, or makes a new one if you are at the end. Alternately, you can use:\n", " \n", "- `Alt-Enter` to force the creation of a new cell unconditionally (useful when inserting new content in the middle of an existing notebook).\n", "- `Control-Enter` executes the cell and keeps the cursor in the same cell, useful for quick experimentation of snippets that you don't need to keep permanently." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print \"Hello\"" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Hello\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Getting help" ] }, { "cell_type": "code", "collapsed": false, "input": [ "?" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Help with `?` and `??`\n", "\n", "Typing `object_name?` will print all sorts of details about any object, including docstrings, function definition lines (for call arguments) and constructor details for classes." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import collections\n", "collections.namedtuple?" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "collections.Counter??" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "*int*?" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "An IPython quick reference card:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%quickref" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Tab completion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tab completion, especially for attributes, is a convenient way to explore the structure of any object you\u2019re dealing with. Simply type `object_name.` to view the object\u2019s attributes. Besides Python objects and keywords, tab completion also works on file and directory names." ] }, { "cell_type": "code", "collapsed": false, "input": [ "collections.Container" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "_abcoll.Container" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The interactive workflow: input, output, history" ] }, { "cell_type": "code", "collapsed": false, "input": [ "2+10" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "12" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "_+10" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "22" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Output control\n", "\n", "You can suppress the storage and rendering of output if you append `;` to the last cell (this comes in handy when plotting with matplotlib, for example):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "10+20;" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "_" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "22" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Output history\n", "\n", "The output is stored in `_N` and `Out[N]` variables:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "Out" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "{8: _abcoll.Container, 9: 12, 10: 22, 12: 22}" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "Out[10]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "22" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "_10" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "22" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "And the last three have shorthands for convenience:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print 'last output:', _\n", "print 'next one :', __\n", "print 'and next :', ___" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "last output: 22\n", "next one : 22\n", "and next : 22\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## The input history is also available" ] }, { "cell_type": "code", "collapsed": false, "input": [ "In[11]" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "u'10+20;'" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "_i" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "u'In[11]'" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "_ii" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "u'In[11]'" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "print 'last input:', _i\n", "print 'next one :', _ii\n", "print 'and next :', _iii" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "last input: _ii\n", "next one : _i\n", "and next : In[11]\n" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "%history" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "collections.\n", "print \"Hello\"\n", "?\n", "import collections\n", "collections.namedtuple?\n", "collections.Counter??\n", "*int*?\n", "%quickref\n", "collections.Container\n", "2+10\n", "_+10\n", "10+20;\n", "_\n", "Out\n", "Out[10]\n", "_10\n", "print 'last output:', _\n", "print 'next one :', __\n", "print 'and next :', ___\n", "In[11]\n", "_i\n", "_ii\n", "print 'last input:', _i\n", "print 'next one :', _ii\n", "print 'and next :', _iii\n", "%history\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Accessing the underlying operating system\n", "\n", "**Note:** the commands below work on Linux or Macs, but may behave differently on Windows, as the underlying OS is different. IPython's ability to access the OS is still the same, it's just the syntax that varies per OS." ] }, { "cell_type": "code", "collapsed": false, "input": [ "!pwd" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction\r\n" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "files = !ls\n", "print \"My current directory's files:\"\n", "print files" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "My current directory's files:\n", "['Exercises.ipynb', 'IPython - beyond plain Python-JME.ipynb', 'IPython - beyond plain Python.ipynb', 'Markdown Cells.ipynb', 'Notebook Basics.ipynb', 'README.md', 'animation.m4v', 'ipython-book.png', 'mknbindex.py', 'mod.py', 'mod.pyc', 'python-logo.svg', 'style.css', 'talktools.py', 'test.txt']\n" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Beyond Python: magic functions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The IPython 'magic' functions are a set of commands, invoked by prepending one or two `%` signs to their name, that live in a namespace separate from your normal Python variables and provide a more command-like interface. They take flags with `--` and arguments without quotes, parentheses or commas. The motivation behind this system is two-fold:\n", " \n", "- To provide an orthogonal namespace for controlling IPython itself and exposing other system-oriented functionality.\n", "\n", "- To expose a calling mode that requires minimal verbosity and typing while working interactively. Thus the inspiration taken from the classic Unix shell style for commands." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%magic" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Line vs cell magics:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%timeit range(10)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 292 ns per loop\n" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "range(10)\n", "range(100)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000000 loops, best of 3: 1.03 \u00b5s per loop\n" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Line magics can be used even inside code blocks:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(5):\n", " size = i*100\n", " print 'size:',size, \n", " %timeit range(size)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "size: 010000000 loops, best of 3: 166 ns per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " size: 1001000000 loops, best of 3: 722 ns per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " size: 2001000000 loops, best of 3: 1.05 \u00b5s per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " size: 3001000000 loops, best of 3: 1.73 \u00b5s per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", " size: 400100000 loops, best of 3: 2.5 \u00b5s per loop" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "\n" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Magics can do anything they want with their input, so it doesn't have to be valid Python:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%bash\n", "echo \"My shell is:\" $SHELL\n", "echo \"My disk status is:\"\n", "df -h" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "My shell is: /bin/bash\n", "My disk status is:\n", "Filesystem Size Used Avail Capacity iused ifree %iused Mounted on\n", "/dev/disk0s2 931Gi 620Gi 310Gi 67% 162716057 81264685 67% /\n", "devfs 192Ki 192Ki 0Bi 100% 665 0 100% /dev\n", "map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net\n", "map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home\n", "/dev/disk2s2 137Mi 126Mi 10Mi 93% 32361 2627 92% /Volumes/VirtualBox\n" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Another interesting cell magic: create any file you want locally from the notebook:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%file test.txt\n", "This is a test file!\n", "It can contain anything I want...\n", "\n", "more..." ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Overwriting test.txt\n" ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "!cat test.txt" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "This is a test file!\r\n", "It can contain anything I want...\r\n", "\r\n", "more..." ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Let's see what other magics are currently defined in the system:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%lsmagic" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "json": [ "{\"cell\": {\"prun\": \"ExecutionMagics\", \"file\": \"Other\", \"!\": \"OSMagics\", \"capture\": \"ExecutionMagics\", \"timeit\": \"ExecutionMagics\", \"script\": \"ScriptMagics\", \"pypy\": \"Other\", \"system\": \"OSMagics\", \"perl\": \"Other\", \"HTML\": \"Other\", \"bash\": \"Other\", \"python\": \"Other\", \"SVG\": \"Other\", \"javascript\": \"DisplayMagics\", \"writefile\": \"OSMagics\", \"ruby\": \"Other\", \"python3\": \"Other\", \"python2\": \"Other\", \"latex\": \"DisplayMagics\", \"sx\": \"OSMagics\", \"svg\": \"DisplayMagics\", \"html\": \"DisplayMagics\", \"sh\": \"Other\", \"time\": \"ExecutionMagics\", \"debug\": \"ExecutionMagics\"}, \"line\": {\"psource\": \"NamespaceMagics\", \"logstart\": \"LoggingMagics\", \"popd\": \"OSMagics\", \"loadpy\": \"CodeMagics\", \"install_ext\": \"ExtensionMagics\", \"colors\": \"BasicMagics\", \"who_ls\": \"NamespaceMagics\", \"lf\": \"Other\", \"install_profiles\": \"DeprecatedMagics\", \"ll\": \"Other\", \"pprint\": \"BasicMagics\", \"lk\": \"Other\", \"ls\": \"Other\", \"save\": \"CodeMagics\", \"tb\": \"ExecutionMagics\", \"lx\": \"Other\", \"pylab\": \"PylabMagics\", \"killbgscripts\": \"ScriptMagics\", \"quickref\": \"BasicMagics\", \"magic\": \"BasicMagics\", \"dhist\": \"OSMagics\", \"edit\": \"KernelMagics\", \"logstop\": \"LoggingMagics\", \"gui\": \"BasicMagics\", \"alias_magic\": \"BasicMagics\", \"debug\": \"ExecutionMagics\", \"page\": \"BasicMagics\", \"logstate\": \"LoggingMagics\", \"ed\": \"Other\", \"pushd\": \"OSMagics\", \"timeit\": \"ExecutionMagics\", \"rehashx\": \"OSMagics\", \"hist\": \"Other\", \"qtconsole\": \"KernelMagics\", \"rm\": \"Other\", \"dirs\": \"OSMagics\", \"run\": \"ExecutionMagics\", \"reset_selective\": \"NamespaceMagics\", \"rep\": \"Other\", \"pinfo2\": \"NamespaceMagics\", \"matplotlib\": \"PylabMagics\", \"unload_ext\": \"ExtensionMagics\", \"doctest_mode\": \"KernelMagics\", \"logoff\": \"LoggingMagics\", \"reload_ext\": \"ExtensionMagics\", \"pdb\": \"ExecutionMagics\", \"load\": \"CodeMagics\", \"lsmagic\": \"BasicMagics\", \"autosave\": \"KernelMagics\", \"cd\": \"OSMagics\", \"pastebin\": \"CodeMagics\", \"prun\": \"ExecutionMagics\", \"cp\": \"Other\", \"autocall\": \"AutoMagics\", \"bookmark\": \"OSMagics\", \"connect_info\": \"KernelMagics\", \"mkdir\": \"Other\", \"system\": \"OSMagics\", \"whos\": \"NamespaceMagics\", \"rmdir\": \"Other\", \"automagic\": \"AutoMagics\", \"store\": \"StoreMagics\", \"more\": \"KernelMagics\", \"pdef\": \"NamespaceMagics\", \"precision\": \"BasicMagics\", \"pinfo\": \"NamespaceMagics\", \"pwd\": \"OSMagics\", \"psearch\": \"NamespaceMagics\", \"reset\": \"NamespaceMagics\", \"recall\": \"HistoryMagics\", \"xdel\": \"NamespaceMagics\", \"xmode\": \"BasicMagics\", \"cat\": \"Other\", \"mv\": \"Other\", \"rerun\": \"HistoryMagics\", \"logon\": \"LoggingMagics\", \"history\": \"HistoryMagics\", \"pycat\": \"OSMagics\", \"unalias\": \"OSMagics\", \"install_default_config\": \"DeprecatedMagics\", \"env\": \"OSMagics\", \"load_ext\": \"ExtensionMagics\", \"config\": \"ConfigMagics\", \"profile\": \"BasicMagics\", \"pfile\": \"NamespaceMagics\", \"less\": \"KernelMagics\", \"who\": \"NamespaceMagics\", \"notebook\": \"BasicMagics\", \"man\": \"KernelMagics\", \"sx\": \"OSMagics\", \"macro\": \"ExecutionMagics\", \"clear\": \"KernelMagics\", \"alias\": \"OSMagics\", \"time\": \"ExecutionMagics\", \"sc\": \"OSMagics\", \"ldir\": \"Other\", \"pdoc\": \"NamespaceMagics\"}}" ], "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "Available line magics:\n", "%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n", "\n", "Available cell magics:\n", "%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n", "\n", "Automagic is ON, % prefix IS NOT needed for line magics." ] } ], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Running normal Python code: execution and errors" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Not only can you input normal Python code, you can even paste straight from a Python or IPython shell session:" ] }, { "cell_type": "code", "collapsed": false, "input": [ ">>> # Fibonacci series:\n", "... # the sum of two elements defines the next\n", "... a, b = 0, 1\n", ">>> while b < 10:\n", "... print b\n", "... a, b = b, a+b" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1\n", "1\n", "2\n", "3\n", "5\n", "8\n" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "In [1]: for i in range(10):\n", " ...: print i,\n", " ...: " ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0 1 2 3 4 5 6 7 8 9\n" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Error display\n", "And when your code produces errors, you can control how they are displayed with the `%xmode` magic:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%file mod.py\n", "\n", "def f(x):\n", " return 1.0/(x-1)\n", "\n", "def g(y):\n", " return f(y+1)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Overwriting mod.py\n" ] } ], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Now let's call the function `g` with an argument that would produce an error:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import mod\n", "mod.g(0)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mmod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m in \u001b[0;36mg\u001b[0;34m(y)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] } ], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Plain exceptions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%xmode plain\n", "mod.g(0)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Exception reporting mode: Plain\n" ] }, { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "Traceback \u001b[0;36m(most recent call last)\u001b[0m:\n", " File \u001b[1;32m\"\"\u001b[0m, line \u001b[1;32m2\u001b[0m, in \u001b[1;35m\u001b[0m\n mod.g(0)\n", " File \u001b[1;32m\"mod.py\"\u001b[0m, line \u001b[1;32m6\u001b[0m, in \u001b[1;35mg\u001b[0m\n return f(y+1)\n", "\u001b[0;36m File \u001b[0;32m\"mod.py\"\u001b[0;36m, line \u001b[0;32m3\u001b[0;36m, in \u001b[0;35mf\u001b[0;36m\u001b[0m\n\u001b[0;31m return 1.0/(x-1)\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m\u001b[0;31m:\u001b[0m float division by zero\n" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 36 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Verbose exceptions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%xmode verbose\n", "mod.g(0)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Exception reporting mode: Verbose\n" ] }, { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mu'xmode verbose'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mglobal\u001b[0m \u001b[0;36mmod.g\u001b[0m \u001b[0;34m= \u001b[0m\n", "\u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m in \u001b[0;36mg\u001b[0;34m(y=0)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mglobal\u001b[0m \u001b[0;36mf\u001b[0m \u001b[0;34m= \u001b[0m\u001b[0;34m\n \u001b[0m\u001b[0;36my\u001b[0m \u001b[0;34m= 0\u001b[0m\n", "\u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(x=1)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m \u001b[0;36mx\u001b[0m \u001b[0;34m= 1\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] } ], "prompt_number": 37 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "The default `%xmode` is \"context\", which shows additional context but not all local variables. Let's restore that one for the rest of our session." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%xmode context" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Exception reporting mode: Context\n" ] } ], "prompt_number": 38 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Raw Input in the notebook" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Since 1.0 the IPython notebook web application support `raw_input` which for example allow us to invoke the `%debug` magic in the notebook:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "code", "collapsed": false, "input": [ "mod.g(0)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "float division by zero", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmod\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m in \u001b[0;36mg\u001b[0;34m(y)\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mZeroDivisionError\u001b[0m: float division by zero" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "%debug" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "> \u001b[0;32m/Users/mcenery/fermi/school/pythonbc/python-bootcamp/Lectures/04_IPythonNotebookIntroduction/mod.py\u001b[0m(3)\u001b[0;36mf\u001b[0;34m()\u001b[0m\n", "\u001b[0;32m 2 \u001b[0;31m\u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m----> 3 \u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\u001b[0;32m 4 \u001b[0;31m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0m\n" ] }, { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "ipdb> quit\n" ] } ], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Don't foget to exit your debugging session. Raw input can of course be use to ask for user input:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "enjoy = raw_input('Are you enjoying this tutorial ?')\n", "print 'enjoy is :', enjoy" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "stream": "stdout", "text": [ "Are you enjoying this tutorial ?yes\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "enjoy is : yes\n" ] } ], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Plotting in the notebook" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "This imports numpy as `np` and matplotlib's plotting routines as `plt`, plus setting lots of other stuff for you to work interactivel very easily:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "output_type": "stream", "stream": "stderr", "text": [ "WARNING: pylab import has clobbered these variables: ['size', 'mod']\n", "`%matplotlib` prevents importing * from pylab and numpy\n" ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.pyplot import gcf" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0, 2*np.pi, 300)\n", "y = np.sin(x**2)\n", "plt.plot(x, y)\n", "plt.title(\"A little chirp\")\n", "f = gcf() # let's keep the figure object around for later..." ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nSUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 49 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The IPython kernel/client model" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "# That's all folks!\n", "

" ] } ], "metadata": {} } ] }